#include <stdio.h>
#include <p18cxxx.h>
#define TRANSBUFSIZE 256

void high_interrupt(void);
void highISR(void);
void transchar(void);
void transmit_setup(void);
void transmit(char *);

#pragma config WDT = OFF
#pragma code low_vector = 0x0018
void low_interrupt(void)
{ _asm goto lowISR _endasm }

#pragma code
#pragma interrupt lowISR
void lowISR(void)	
{
	INTCONbits.GIEH = 0; 			// global interrupt disable
	
	if(PIR1bits.TXIF == 1 && PIE1bits.TXIE == 1)	// transmit enabled, transmit shift register empty
	{ transchar(); } 				// transmit next character

	INTCONbits.GIEH = 1; 			// global interrupt enable
}

// Globals
char transbuf[TRANSBUFSIZE] = "";	//transmit buffer
char transbufi = 0; 			// buffer insertion index from string
char transbufr = 0; 			// buffer removal index to transmit shift register



void transmit_setup(void)
// Setup function, or parameters to include in a central setup function
{	
	TRISCbits.TRISC7 = 1;		// PortC 7 is output
	TRISCbits.TRISC6 = 0;		// PortC 6 is input

	TXSTAbits.SYNC = 0;		// asynchronous mode
	TXSTAbits.BRGH = 1;		// high baud rate
	SPBRG = 25;			// for baud rate 9600
	TXSTAbits.TX9 = 0;			// 8-bit transmission
	TXSTAbits.TXEN = 1;		// enable transmission

	RCSTAbits.SPEN = 1; 		// Enable serial port	

	INTCONbits.GIEH = 1;		// (IPEN = 1) -> enable high-priority interrupts globally
	INTCONbits.GIEL = 1;		// (IPEN = 1) -> enable low-priority peripheral interrupts
}

void transmit(char* trans_string)
// Transmit function, writes string into buffer and starts sending
{
	char i = 0;
	while(transbuf[transbufi] != '\0')		// until null termination of string reached
	{
	transbuf[transbufi] = trans_string[i];		// copy string into transmit buffer
	transbufi++;
	if(transbufi >= TRANSBUFSIZE) { transbufi = 0; }	// catch insertion index overflow 
	i++;
	}

	PIE1bits.TXIE = 1; 				// enable transmit interrupt
	transchar(); 				// transmit first character
}

void transchar(void)
// Transmit function, gets next char for TXREG as long as transmission buffer has more material to write
{
	TXREG = transbuf[transbufr]; 		// load character into transmit shift register

	transbufr++;				// increment removal index
	if(transbufr >= MAXSIZE) { transbufr = 0; } 	// catch removal index overflow 

	if (transbufr  == transbufi) 			// if removal index catches insertion index, end of transmission has been reached
	{ PIE1bits.TXIE = 0; } 			// disable transmit interrupt
}

	